﻿using System;
using System.ComponentModel;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GanagroLiteData;
using Csla.Validation;
using GeneralUtilities;

namespace GanagroLiteBO
{
    public class ReversoBO : IEditableObject, INotifyPropertyChanged, IDataErrorInfo
    {
        private REVERSO currentReversoDO;
        private Operacion_BO currentOperacion;
        private GANADO_BO currentGanado;

        #region Properties
        #endregion

        #region Constructor


        public ReversoBO(GANADO_BO ganado, Operacion_BO oBo)
        {
            currentGanado           = ganado;
            currentOperacion        = oBo;

            currentReversoDO        = new REVERSO();
            currentReversoDO.codigo = oBo.CODIGO;
            currentReversoDO.ReversoOper = (short)oBo.OPERACION;
            currentReversoDO.fecha       = oBo.FECHA;
        }

        private ReversoBO()
        {
        }

        #endregion

        #region Methods

        private void ReversarCompra()
        {
            using (GlContext gContext = new GlContext())
            {
                gContext.REVERSOS.Add(currentReversoDO);
                 PESAJE p = gContext.PESAJES.First(w => (w.Fecha == currentOperacion.FECHA &&
                                       w.Codigo == currentOperacion.CODIGO &&
                                       w.Operacion == currentOperacion.OPERACION));
                 gContext.PESAJES.Remove(p);

                 OPERACIONE o = gContext.OPERACIONES.Single(q => q.FECHA == currentOperacion.FECHA &&
                                                            q.CODIGO == currentOperacion.CODIGO &&
                                                            q.OPERACION == currentOperacion.OPERACION);
                 gContext.OPERACIONES.Remove(o);
                 GANADO g = gContext.GANADOes.Single(r => r.CODIGO == currentOperacion.CODIGO);
                 gContext.GANADOes.Remove(g);

                 gContext.SaveChanges();

            }
        }

        private void ReversarPesaje()
        {
            using (GlContext gContext = new GlContext())
            {
                gContext.REVERSOS.Add(currentReversoDO);
                PESAJE pesaje = gContext.PESAJES.Single(p => p.Fecha == currentOperacion.FECHA &&
                                      p.Codigo == currentOperacion.CODIGO &&
                                      p.Operacion == currentOperacion.OPERACION);
                gContext.PESAJES.Remove(pesaje);

                gContext.SaveChanges();

            }
        }

        private void ReversarVenta()
        {
            currentGanado.DarDeAlta();
            using (GlContext gContext = new GlContext())
            {
                PESAJE pesaje = gContext.PESAJES.Single(p => p.Fecha == currentOperacion.FECHA &&
                                      p.Codigo == currentOperacion.CODIGO &&
                                      p.Operacion == currentOperacion.OPERACION);
                gContext.PESAJES.Remove(pesaje);

                OPERACIONE o = gContext.OPERACIONES.Single(q => q.FECHA == currentOperacion.FECHA &&
                                                           q.CODIGO == currentOperacion.CODIGO &&
                                                           q.OPERACION == currentOperacion.OPERACION);
                gContext.OPERACIONES.Remove(o);

                gContext.SaveChanges();
            }
        }

        private void ReversarMuerte()
        {
            using (GlContext gContext = new GlContext())
            {
                OPERACIONE o = gContext.OPERACIONES.Single(q => q.FECHA == currentOperacion.FECHA &&
                                                           q.CODIGO == currentOperacion.CODIGO &&
                                                           q.OPERACION == currentOperacion.OPERACION);
                gContext.OPERACIONES.Remove(o);

                gContext.SaveChanges();
            }

            currentGanado.DarDeAlta();
        }


        public void reversar()
        {
            switch ((TiposOperacion)currentReversoDO.ReversoOper)
            {
                case TiposOperacion.compra:
                    ReversarCompra();
                    break;
                case TiposOperacion.Pesaje_Carne:
                    ReversarPesaje();
                    break;
                case TiposOperacion.venta:
                    ReversarVenta();
                    break;
                case TiposOperacion.Muerte:
                    ReversarMuerte();
                    break;
                default:
                    break;
            }
        }

        #endregion Methods

        #region Validaciones

        private ValidationRules _validationRules;
        public ValidationRules ValidationRules
        {
            get
            {
                if (_validationRules == null)
                    _validationRules = new ValidationRules(this);
                return _validationRules;
            }
        }

        public bool Isvalid()
        {
            ValidationRules.CheckRules();
            return ValidationRules.GetBrokenRules().ErrorCount == 0;
        }

        public string Warnings()
        {
            {
                return ValidationRules.GetBrokenRules().ToString(Csla.Validation.RuleSeverity.Warning);
            }
        }


        private void AddBusinessRules()
        {
            try
            {
            }
            catch (Exception ex)
            {
                throw (new Exception("AddBusinessRules: " + ex.Message, ex));
            }

        }

        #endregion

        #region INotifyPropertyChanged Implementation
        protected void FirePropertyChangedNotification(string propName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
            ValidationRules.CheckRules(propName);
        }

        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region IDataErrorInfo Members


        [Browsable(false)]
        public string Error
        {
            get
            {
                if (!ValidationRules.IsValid)
                {
                    return ValidationRules.GetBrokenRules().First().Description;
                }
                else
                { return String.Empty; }
            }
        }

        [Browsable(false)]
        public string this[string columnName]
        {
            get
            {
                string result = string.Empty;
                if (!ValidationRules.IsValid)
                {
                    BrokenRule rule = ValidationRules.GetBrokenRules().GetFirstBrokenRule(columnName);
                    if (rule != null)
                        result = rule.Description;
                }

                return result;
            }
        }
        #endregion

        #region IEditableObject Members

        public void BeginEdit()
        {
        }

        public void CancelEdit()
        {
        }

        public void EndEdit()
        {
        }

        #endregion

    }
}
